#include "graph.h"
#include <time.h>

// 函数声明（在实际实现中会包含在头文件中）
Graph* load_graph_from_csv(const char* nodes_file, const char* edges_file);

int main(int argc, char* argv[]) {
    printf("=== 神经网络处理器调度优化 - C语言版本 ===\n\n");
    
    // 初始化随机数生成器
    srand((unsigned int)time(NULL));
    
    // 1. 设置参数（快速测试配置）
    OptOptions opts = {
        .iterations = 100,            // 阶段一迭代次数（快速测试：100，生产环境建议5000）
        .batch_size = 20,             // 批处理大小（快速测试：20，生产环境建议100）
        .patience = 50,               // 耐心值（快速测试：50，生产环境建议200）
        .max_passes = 5,              // 阶段二最大轮数（快速测试：5，生产环境建议100）
        .time_limit_minutes = 2,      // 时间限制（快速测试：2分钟，生产环境建议30分钟）
        .num_threads = 4              // 线程数
    };
    
    printf("使用快速测试参数配置（性能可能不是最优，但运行速度快）\n");
    
    #ifdef _OPENMP
    omp_set_num_threads(opts.num_threads);
    printf("OpenMP并行计算已启用，使用 %d 个线程\n", opts.num_threads);
    #else
    printf("警告：OpenMP未启用，将使用单线程运行\n");
    #endif
    
    // 2. 加载数据
    const char* nodes_file = "data/CSV-version/Conv_Case0_Nodes.csv";
    const char* edges_file = "data/CSV-version/Conv_Case0_Edges.csv";
    
    if (argc >= 3) {
        nodes_file = argv[1];
        edges_file = argv[2];
    }
    
    printf("加载数据文件: %s, %s\n", nodes_file, edges_file);
    Graph* g = load_graph_from_csv(nodes_file, edges_file);
    
    if (!g) {
        printf("错误：无法加载图数据\n");
        return 1;
    }
    
    print_graph_stats(g);
    
    // 验证传递闭包计算
    printf("\n=== 验证传递闭包计算 ===\n");
    verify_transitive_closure(g);
    print_transitive_closure(g, "c_transitive_closure.txt");
    
    // 3. 生成初始调度
    printf("\n=== 生成初始调度 ===\n");
    Schedule* initial = generate_initial_schedule(g);
    
    if (!initial) {
        printf("错误：无法生成初始调度\n");
        free_graph(g);
        return 1;
    }
    
    printf("初始调度生成成功！\n");
    print_schedule_stats(initial);
    
    // 4. 执行两阶段优化
    printf("\n=== 开始两阶段优化 ===\n");
    double total_start = get_time_seconds();
    
    // 阶段一：广域探索
    printf("\n--- 阶段一：广域探索 ---\n");
    Schedule* phase1_result = optimizer_random_sampling(initial, g, &opts);
    
    if (!phase1_result) {
        printf("错误：阶段一优化失败\n");
        free_schedule(initial);
        free_graph(g);
        return 1;
    }
    
    printf("阶段一完成! 分数从 %d 优化至 %d\n", 
           initial->max_vstay, phase1_result->max_vstay);
    
    // 阶段二：深度优化
    printf("\n--- 阶段二：深度优化 ---\n");
    Schedule* final_result = optimizer_systematic_search(phase1_result, g, &opts);
    
    if (!final_result) {
        printf("错误：阶段二优化失败\n");
        free_schedule(phase1_result);
        free_schedule(initial);
        free_graph(g);
        return 1;
    }
    
    printf("阶段二完成! 分数从 %d 进一步优化至 %d\n", 
           phase1_result->max_vstay, final_result->max_vstay);
    
    double total_elapsed = get_time_seconds() - total_start;
    
    // 5. 输出最终结果
    printf("\n=== 最终优化结果 ===\n");
    printf("初始解分数: %d\n", initial->max_vstay);
    printf("阶段一后分数: %d\n", phase1_result->max_vstay);
    printf("最终优化分数: %d\n", final_result->max_vstay);
    
    if (initial->max_vstay > 0) {
        int improvement = initial->max_vstay - final_result->max_vstay;
        double improvement_pct = 100.0 * improvement / initial->max_vstay;
        printf("总计内存占用降低了: %d (%.2f%%)\n", improvement, improvement_pct);
    }
    
    printf("总优化时间: %.2f 秒\n", total_elapsed);
    
    // 6. 保存结果（简化版）
    FILE* result_fp = fopen("c_optimization_results.txt", "w");
    if (result_fp) {
        fprintf(result_fp, "=== C语言优化结果 ===\n");
        fprintf(result_fp, "初始解分数: %d\n", initial->max_vstay);
        fprintf(result_fp, "阶段一后分数: %d\n", phase1_result->max_vstay);
        fprintf(result_fp, "最终优化分数: %d\n", final_result->max_vstay);
        fprintf(result_fp, "总优化时间: %.2f 秒\n", total_elapsed);
        
        fprintf(result_fp, "\n=== 最终调度序列 ===\n");
        for (int i = 0; i < final_result->length; i++) {
            fprintf(result_fp, "%d\n", final_result->schedule[i]);
        }
        
        fprintf(result_fp, "\n=== V_stay历史 ===\n");
        for (int i = 0; i < final_result->length; i++) {
            fprintf(result_fp, "%d,%d\n", i + 1, final_result->vstay_history[i]);
        }
        
        fclose(result_fp);
        printf("结果已保存到: c_optimization_results.txt\n");
    }
    
    // 7. 清理内存
    free_schedule(final_result);
    free_schedule(phase1_result); 
    free_schedule(initial);
    free_graph(g);
    
    printf("\n=== 程序执行完毕 ===\n");
    return 0;
}
